package com.fare.taluo.fusionCharts;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 报表FusionCharts 模版模型
 * @author Administrator
 *
 */
public class FusionChartsTemplateModel {

	//===========================================目前taluo报表比较常用到的属性，以后可以慢慢添加是吧~~
	public final static String AN_ShowValues ="showValues"; //是否在图表显示对应的数据值，默认为1(True)
	public final static String AN_showNames="showNames";//[bool]是否显示横向坐标轴(x轴)标签名称
	public final static String AN_RotateValues="rotateValues";//[bool]是否滚动显示值 （showValues=’1’）
	public final static String AN_Caption ="caption";//[string]图表主标题
	public final static String AN_SubCaption ="subCaption";//[string] 图表副标题
	public final static String AN_XAxisName="xAxisName";//[string]横向坐标轴(x轴)名称
	public final static String AN_YAxisName="yAxisName";//[string] 纵向坐标轴(y轴)名称
	public final static String AN_BaseFont ="baseFont";//[string]图表字体样式，如“宋体”、“黑体”
	public final static String AN_BaseFontSize ="baseFontSize";//[number]图表字体大小
	public final static String AN_OutCnvBaseFont="outCnvBaseFont";//[string]图表画布以外的字体样式
	public final static String AN_OutCnvBaseFontSize="outCnvBaseFontSize";//[number]图表画布以外的字体大小
	public final static String AN_LabelDisplay="labelDisplay";//[string ]标签的呈现方式[“WRAP”,”STAGGER”,”ROTATE”,“NONE”]（超长屏蔽、折行、倾斜、不显示）
	public final static String AN_NumberPrefix="numberPrefix";//[string]增加数字前缀
	public final static String AN_NumberSuffix="numberSuffix";//[string]增加数字后缀
	public final static String AN_SNumberPrefix="snumberPrefix";//[string]增加数字前缀(右边)
	public final static String AN_SNumberSuffix="snumberSuffix";//[string]增加数字后缀（右边）
	public final static String AN_FormatNumberScale="formatNumberScale";//[bool]是否格式化数字,默认为1(True),自动的给你的数字加上K（千）或M（百万）；若取0,则不加K或M
	public final static String AN_SetAdaptiveYMin="setAdaptiveYMin";//设置y轴的最小值是0还是让chart根据显示值（values）自动显示合适的最小值
	//<chart PYAxisMinValue='0' PYAxisMaxValue='100' SYAxisMinValue='10' SYAxisMaxValue='20' ..>
	//PYAxisMinValue 和PYAxisMaxValue代表主y轴的设置，SYAxisMinValue和SYAxisMaxValue代表副y轴的设置。
	public final static String AN_SyncAxisLimits="syncAxisLimits";////如果你想使双y轴使用同一个limits,<chart syncAxisLimits='1' ..> 
	public final static String AN_AnchorRadius="anchorRadius";//[number] pixels 半径[number]折线节点半径，数字
	//多条折线中<dateset>的参数：
	public final static String AN_Seriesname="Seriesname";//[string]折线的名称，显示在报表下面的报表线条的名称，如CA1122
	public final static String AN_Color="color";//[color]折线的颜色
	public final static String AN_ShowValue="showValue";//[bool]是否显示折线的节点值
	public final static String AN_ShowName="showName";//[bool]是否显示折线的名称
	public final static String AN_Alpha="alpha";//[number]折线的透明度
	public final static String AN_LineThickness="lineThickness";//[number]折线的厚度
	public final static String AN_RenderAs="renderAs";//把数据渲染成折现还是柱子还是其他什么玩意的 Colum、Line
	public final static String AN_Dashed="dashed";//虚线
	public final static String AN_ShowLabels ="showLabels ";//(是否显示x轴的坐标值)
	public final static String AN_ParentYAxis="parentYAxis";//值是根据左坐标值（P）还是由坐标值（S）MSCombiDY2D.swf
	//真假值
	public final static String AV_AttrTrue="1";
	public final static String AV_AttrFalse="0";
	//attrValue
	public final static String AV_FontSizeStyle_10="10";
	public final static String AV_FontSizeStyle_13="13";
	public final static String AV_FontSizeStyle_15="15";
	//报表的系列
	public static enum Series{
		Single_Series,Multi_Series
	}
	//某些风格
	public final static String STYLE_ToolTip_FontSize_15="<style name='ToolTextFont_15' type='font' size='15'/>";
	public final static String STYLE_Caption_FontSize_15="<style name='CaptionFontSize_15' type='font' size='15'/>";
	
	
	private Series defaultSeries=Series.Multi_Series;//默认是多系列报表
	private Map<String,String> chart_Attr_Map=new HashMap<String,String>();//报表_属性_值_Map
	private List<String> categroyLabels=new ArrayList<String>();//X轴的每一个值
	private StringBuffer categroyFullStr=new StringBuffer();//X轴的每一个完整的category字符串
	private Map<Long ,HashMap<String,String>> dataSet_Id_Attr_Map=new  HashMap<Long,HashMap<String,String>>();//dataSet,唯一ID和其对应属性Map
	private Map<Long,String> set_DataSetId_SetFullStr_Map=new HashMap<Long,String>();//对应一个dataSet的一个完整的set字符串
	private Map<Long,List<String>> set_DataSetId_SetValues_Map=new HashMap<Long,List<String>>();//对应一个dataSet的一系列set的value值
	
	private StringBuffer set_Single_FullStr=new StringBuffer();//完整的单系列报表的set字符串,目前不考虑单独赋值，因为其实很多时候不止value一个值在单系列的时候
	//<set name='Web客户端用户登录' value='10'/><set name='客户端登录' value='12' />
	private Map<String,List<String>> toObject_Styles_Map=new HashMap<String,List<String>>();//指向的元素_其style_map
	
	
	private FusionChartsTemplateModel() {}
	/**
	 * 获得一个纯净的模型，不推荐使用
	 * @return
	 */
	public static FusionChartsTemplateModel getNewInstance(){return new FusionChartsTemplateModel();}
	/**
	 * 获得一个拥有部分默认模版的模型（多系列）
	 * @return
	 */
	public static FusionChartsTemplateModel getNewDefaultInstance(){
		return FusionChartsTemplateModel.getNewDefaultInstance(Series.Multi_Series);
	}
	/**
	 * 获得一个指定系列的模版模型
	 * @param series
	 * @return
	 */
	public static FusionChartsTemplateModel getNewDefaultInstance(Series series){
		FusionChartsTemplateModel m=new FusionChartsTemplateModel();
		m.addChartAttr(FusionChartsTemplateModel.AN_ShowValues, FusionChartsTemplateModel.AV_AttrFalse);//是否显示set的Value值
		m.addChartAttr(FusionChartsTemplateModel.AN_ShowLabels,FusionChartsTemplateModel.AV_AttrTrue);;//横向坐标轴下面的一个个日期
		m.addChartAttr(FusionChartsTemplateModel.AN_BaseFontSize,FusionChartsTemplateModel.AV_FontSizeStyle_10);
		m.addChartAttr(FusionChartsTemplateModel.AN_OutCnvBaseFontSize, FusionChartsTemplateModel.AV_FontSizeStyle_13);
		m.addChartAttr(FusionChartsTemplateModel.AN_LabelDisplay, "ROTATE");
		m.addChartAttr(FusionChartsTemplateModel.AN_SetAdaptiveYMin, FusionChartsTemplateModel.AV_AttrTrue);
		m.addChartAttr(FusionChartsTemplateModel.AN_AnchorRadius, "5");
		m.addChartAttr(FusionChartsTemplateModel.AN_NumberPrefix, "￥");
		m.setSeries(series);
		return m;
	}
	
	/**
	 * 设置报表的系列
	 * @param series
	 */
	public void setSeries(Series series){
		this.defaultSeries=series;
	}
	
	/**
	 * 放入报表属性
	 * @param attrName
	 * @param attrValue
	 */
	public void addChartAttr(String attrName,String attrValue){
		this.chart_Attr_Map.put(attrName.toUpperCase(), attrValue);
	}
	
	/**
	 * 单独放入一个横坐标轴的label值
	 * 
	 */
	public void addCategoryLabel(String label){
		this.categroyLabels.add(label);
	}
	/**
	 * 放入一系列label的值
	 * @param labels
	 */
	public void addCategroyLabels(List<String> labels){
		this.categroyLabels.addAll(labels);
	}
	/**
	 * 放入一个标准的<categroy/>字符串
	 * 调用此方法之后，则addCategoryLabel，addCategroyLabels将会失效
	 * @param categoryStr
	 */
	public void addCategroyFullStr(String categoryStr){
		this.categroyFullStr.append(categoryStr);
	}
	/**
	 * 放入一系列表标准的<categroy/>字符串
	 * 调用此方法之后，则addCategoryLabel，addCategroyLabels将会失效
	 * @param categorys
	 */
	public void addCategroyFullStrs(List<String> categorys){
		for(String s:categorys){
			this.categroyFullStr.append(s);
		}
	}
	
	/**
	 * 添加一个唯一ID的dataSet,重复则覆盖
	 */
	public void createDataSet(long id){
		dataSet_Id_Attr_Map.put(id, new HashMap<String,String>());
		this.set_DataSetId_SetValues_Map.put(id, new ArrayList<String>());
	}
	/**
	 * 对指定的dataSet赋值属性值
	 * @param id
	 * @param attrName
	 * @param value
	 */
	public void addDataSetAttr(long id,String attrName,String attrValue){
		if(this.dataSet_Id_Attr_Map.containsKey(id)){
			this.dataSet_Id_Attr_Map.get(id).put(attrName.toUpperCase(), attrValue);
		}
	}
	/**
	 * 把事先生成的标准sets字符串放入已有的dataSet
	 * 推荐使用此方式，这样可以集成虚线策略以及模版策略
	 * 策略来自FusionChartsUtil_2
	 * 调用此方法则addSetValueIntoDataSet失效
	 * @param id
	 * @param sets
	 */
	public void addSetFullStrIntoDataSet(long id,String sets){
		this.set_DataSetId_SetFullStr_Map.put(id, sets);
	}
	/**
	 * 放入一个set的value值到dataSet里面
	 * @param id
	 * @param value
	 */
	public void addSetValueIntoDataSet(long id,double value){
		this.set_DataSetId_SetValues_Map.get(id).add(String.valueOf(value));
	}
	
	/**
	 * 添加一个单系列的完整set字符串
	 * @param s
	 */
	public void addSetSingleFullStr(String s){
		this.set_Single_FullStr.append(s);
	}
	
	/**
	 * 为某一个属性指定一个完整style的语句
	 */
	public void addStyleToObject(String toObject,String styleFullStr){
		if(toObject==null || "".equals(toObject.trim()) || styleFullStr==null || "".equals(styleFullStr.trim())){
			return;
		}
		String key=toObject.toUpperCase();
		if(!this.toObject_Styles_Map.containsKey(key)){
			this.toObject_Styles_Map.put(key, new ArrayList<String>());
		}
		this.toObject_Styles_Map.get(key).add(styleFullStr.toUpperCase());
	}
	
	
	
	
	
	
	public Map<String, List<String>> getToObject_Styles_Map() {
		return toObject_Styles_Map;
	}
	public Series getDefaultSeries() {
		return defaultSeries;
	}
	public Map<String, String> getChart_Attr_Map() {
		return chart_Attr_Map;
	}
	public List<String> getCategroyLabels() {
		return categroyLabels;
	}
	public StringBuffer getCategroyFullStr() {
		return categroyFullStr;
	}
	public Map<Long, HashMap<String, String>> getDataSet_Id_Attr_Map() {
		return dataSet_Id_Attr_Map;
	}
	public Map<Long, String> getSet_DataSetId_SetFullStr_Map() {
		return set_DataSetId_SetFullStr_Map;
	}
	public Map<Long, List<String>> getSet_DataSetId_SetValues_Map() {
		return set_DataSetId_SetValues_Map;
	}
	public StringBuffer getSet_Single_FullStr() {
		return set_Single_FullStr;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}
